package Reflect;

import java.util.ArrayList;

public class ReflectDemo3 {
    public static void main(String[] args) throws Exception{
        /*
         * 使用反射创建对象
         * - Class.newInstance() 方法
         *    - 目标类型一定包含无参数构造器！否则出现异常
         */
        //创建 ArrayList 类型的对象
        //1. 获取 Class 对象
        Class cls = ArrayList.class;
        //2. 调用 newInstance 方法，返回Object类型的引用，
        //   实际是ArrayList类型对象
        //   可能出现异常: 没有无参数构造器、构造器执行错误
        Object obj = cls.newInstance();
        System.out.println(obj);

        //使用反射创建 自定义 类对象：
        //1. 获取 Class 对象
        //2. 使用 反射API

        // 动态加载类型 "reflect.Worker"
        Class cls1 = Class.forName("reflect.Worker"); //reflect.Person
        // 创建对象
        Object obj1 = cls1.newInstance();
        // 测试创建的对象
        System.out.println(obj1);

        //使用硬编码创建对象
        Worker worker = new Worker();
        System.out.println(worker);
        /*
         * 使用反射动态创建对象 和 硬编码创建对象的区别：
         * - 反射创建对象：可以根据一个动态的类名创建对象，如果类名换了
         *   就可以创建新类型的对象。性能稍差！
         * - 硬编码创建对象：必须知道类名，根据类名创建对象。
         *   创建的对象类型固定不变的。
         */
    }
}
